<?php
/**
 * 观察者模式
 * 观察者模式(Observer)，当一个对象状态发生变化时，依赖它的对象全部会收到通知，并自动更新。观察者模式实现了低耦合，非侵入式的通知与更新机制。
 */

/**
 * 观察者接口
 */
interface Observer
{
    public function watch();
}

/**
 * 主题接口
 */
interface SubjectAction
{
    public function register(Observer $observer);
    public function notify();
}

/**
  *观察者
  */
class Action implements SubjectAction
{
    public $_object = [];
    
    public function register( Observer $observer )
    {
        $this->_object[] = $observer;
    }
    public function notify()
    {
        foreach($this->_object as $observer)
        {
            $observer->watch();
        }
    }
}

//被观察者
class Cat implements Observer
{
    public function watch()
    {
        echo "cat";
    }
}

class Dog implements Observer
{
    public function watch()
    {
        echo "dog";
    }
}

$action = new Action();
$action->register(new Cat());
$action->register(new Dog());
$action->notify();